JS逆向实战案例
案例一:某平台数据加密
测试时抓包发现数据包的请求包和返回包内容都进行了加密,且请求包内容形如:abchtrne/rerhn34rhnfe,而返回包内容则为{"data":"reene43jygrnd534htrfdre"},由此可见该站请求包和返回包内容的加密方式不相同
点击调试器,选中要查看的js文件,点击下方的{}使代码更容易查看
寻找加解密关键点,在encryption文件夹下的js文件可以看到该项目很有可能使用的是国密加密算法SM3,SM4
在app.js中搜索关键词sm3,sm4,encryptData等关键词,找到加解密方法,以下os和rs方法为请求包加密方法,而cs和ls则为返回包解密函数。由于从数据包中看到的请求体数据和返回包数据的格式分别为字符和json数据。os方法加密后的数据为json格式,因此请求包加密方式为先使用SM4的CBC模式加密,然后使用ECB模式进行加密,最后使用SM3对json数据加密。
由于返回包json数据中并没有iv,但是存在data参数,因此返回包的解密方式为先使用ls方法再使用cs方法
使用控制台先调用ls方法第一次解密返回包内容
查看第一次解密后的数据
调用cs方法获取真实数据
在控制台中debuge调试,t字段中包含加密前的数据
在控制台中修改t中的数据即可在加密前修改请求包内容
案例二:某平台数据加密+签名
某平台登记完基础信息后点击提交信息查看数据包可以看到数据均被加密
同时该功能点存在反调试相关代码
当右键点击检查时网页自动进入调试状态
在debugger处下断点选择修改断点
设置为false即可
请求包和返回包中均存在三个参数,x、x1、sign
查看js代码寻找加密逻辑其中x1疑似aes加密,直接搜索关键词定位到关键代码代码逻辑大致如下(代码经过简化)
通过查看代码知道x为AES加密后的json数据,x1是经过RSA加密后的AES密钥,sign则是某种签名,且AES加密的密钥为动态密钥。继续查看RSA加密方法,key_1就是RSA加密的私钥
既然知道了RSA私钥,且数据包中存在x1参数,那些直接使用RSA私钥解密X1参数获取AES加密的密钥
然后再用获取的AES密钥解密X内容获取真实请求数据
而签名可以直接通过调用js的sign()去计算